<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- <script src="./js/01-构造函数.js"></script> -->
    <!-- <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js"></script> -->
    
</head>
<body>
    <script>
        // console.dir(axios);
        // let a = new axios.Axios();
        // console.log(a);


        /**
         * Axios 构造函数
         * CancelToken： 构造函数
         * 
         * 方法：
         * create
         * defaults
         * 
         * 请求方法
         * delete
         * get
         * patch
         * post
         * put
         * request:请求的基础方法
         * 
         * 拦截器
         * interceptors
         *    request:{
         *      handlers:[]
         *    }
         *    response:{
         *      hanlers:[]
         *    }
         * 
         * 
         * axios 具有 Axios 实例对象身上所有的属性和方法
         *       Axios.prototype.[request、put、post....]
         * 
         *       拦截器和 defaults
         * 
         */ 
        
        
        
        function Axios(config){
            this.defaults = config;
            this.interceptors = {
                response:'响应拦截器',
                request:'请求拦截器'
            }
        }

        
        Axios.prototype.request = function(config){
            return new Promise((resolve ,reject)=>{
                resolve('ok')
            })
        }
        const methods = ['put','post','delete','get','patch']
        methods.forEach(methodName=>{
            Axios.prototype[methodName] = function(){
                // 模拟Axios结构，没有方法具体实现
            }
        })
        console.dir(Axios);

        /**
         * 创建 axios
         * axios的身份是request函数,函数中的this，指向Axios的实例对象，因为要使用interceptors
         * 
         */
        function createInstance(config){
            // 创建一个Axios的实例对象
            const context = new Axios(config);// defaults interceptors
            // axios 是一个函数，axios({})发请求
            const instance = Axios.prototype.request.bind(context);
            // 给他添加上属性和方法
            // console.log(Object.keys(Axios.prototype));
            // Object.keys(Axios.prototype)
            // 将Axios.prototype原型上的方法，都添加给instance
            Object.keys(Axios.prototype).forEach(methodName=>{
                // console.log(methodName);
                instance[methodName] = Axios.prototype[methodName]
            })
            // 将实例对象身上的defaults和拦截器也给instance
            Object.keys(context).forEach(key=>{
                instance[key] = context[key]
            })
            // console.dir(instance);
            return instance;
        }

        const axios = createInstance({})

        axios.Axios = Axios;

        axios.create = function(config){
            return createInstance(config)
        }

        console.dir(axios);
        
    </script>
</body>
</html>